package caronas.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;
import caronas.dao.UsuarioDao;
import caronas.infra.LoginBypass;
import caronas.modelo.Service;
import caronas.modelo.Usuario;
import caronas.modelo.UsuarioWeb;
import caronas.util.FacebookUtils;

@Resource
public class UsuarioController {
	private UsuarioDao dao;
	private Result result;
	private Validator validator;
	private UsuarioWeb usuarioWeb;
	private HttpServletRequest request;
	private HttpServletResponse response;
	private FacebookUtils fbUtils;
	
	public UsuarioController(UsuarioDao dao, Result result, Validator validator, UsuarioWeb usuarioWeb, HttpServletRequest request, HttpServletResponse response, FacebookUtils fbUtils) {
		this.dao = dao;
		this.result = result;
		this.validator = validator;
		this.usuarioWeb = usuarioWeb;
        this.request = request;
        this.response = response;
        this.fbUtils = fbUtils;
	}
	
	
	@Get @Path("/usuario")
	public List<Usuario> listar() {
		return dao.listar();
	}
	
	@LoginBypass
	@Post @Path("/fb-auth")
	public void facebookLogin(String userId, String token){
		Service fb = dao.buscaProvedorUsario("facebook", userId);		
		Usuario usuario;
		
		if(fb == null){
			fb = fbUtils.montarService(userId, token);
			usuario = fbUtils.montarUsuario(fb);
			dao.adicionar(usuario);
		}
		else{
			dao.updateServiceToken(fb, token);
		}
		
		String uri;
		usuarioWeb.login(fb.getUsuario(), fb);
		if((uri = (String)request.getSession().getAttribute("called_uri")) != null ){
        	result.redirectTo(uri);
        }
        else{
        	result.redirectTo(CaronaController.class).listar();
        }
	}
	
	@LoginBypass
	@Post @Path("/usuario")
	public void adicionar(Usuario usuario) {
		dao.adicionar(usuario);
		result.redirectTo(this).listar();
	}
	
	@LoginBypass
	@Path("/usuario/novo")
	public void form() {}
	
	@Get @Path("/usuario/{id}")
	public Usuario editar(Long id) {
		return dao.carregar(id);
	}
	
	@Put @Path("/usuario/{usuario.id}")
	public void atualizar(Usuario usuario) {
		dao.atualizar(usuario);
		result.redirectTo(this).listar();
	}
	
	@Delete @Path("/usuario/{id}")
	public void remover(Long id) {
		dao.remover(dao.carregar(id));
		result.redirectTo(this).listar();
	}
	
	@LoginBypass
	@Get @Path("/login")
	public void loginForm() {
		usuarioWeb.logout();
	}
	
	@LoginBypass
	@Post @Path("/login")
	public void login(Usuario usuario) {
		Usuario carregado = dao.carrega(usuario);
		if (carregado == null) {
			validator.add(new ValidationMessage("Login e/ou senha inv�lidos", "usuario.login"));
			System.out.println("Login e/ou senha inv�lidos");
		}
		validator.onErrorUsePageOf(UsuarioController.class).loginForm();
		
		System.out.println("ACHOU Login e senha");
		//usuarioWeb.login(carregado);
    	String uri = "haha";
        if((uri = (String)request.getSession().getAttribute("called_uri")) != null ){
        	result.redirectTo(uri);
        }
        else{
        	result.redirectTo(CaronaController.class).listar();
        }
		
	}
	
	@LoginBypass
	@Get @Path("/logout")
	public void logout() {
		usuarioWeb.logout();
		result.redirectTo(CaronaController.class).listar();
	}
	
}
